package thread;

public class Demo07Sync {
    public static void main(String[] args) {
        Shop shop = new Shop();
        //
        Thread t1 = new Thread("王硕博"){
            public void run() {
                shop.buy();
            }
        };
        //
        Thread t2 = new Thread("王伟超"){
            public void run() {
                shop.buy();
            }
        };
        t1.start();
        t2.start();
    }
}

class Shop {
    //public synchronized void buy(){
    public void buy() {
        //ctrl+alt+t:try\catch
        try {
            Thread t = Thread.currentThread();
            System.out.println(t.getName() + "正在挑衣服...");
            Thread.sleep(5000);
            /*
                同步块可以灵活的控制需要多线程执行的代码片段;
                同步块必须要求指定同步监视器对象[参数],该对象必须满足以下2点:
                1.必须是引用类型,不能是基本类型;
                2.多个需要排队执行的线程看到的必须是 同一个 对象;

                合适的锁对象：
                1.在产生并发安全的问题时，同步监视器对象应当为同一个对象；
                2.否则应当是不同的对象；
             */
            synchronized (this) {
                //1.先使用this
                //2.new Object():不行，因为两个线程看到的不是同一个对象；
                //3.t：不行，因为两个线程看到的不是同一个对象，都是自身的线程对象t1和t2
                //4."hello"：可以，因为两个线程看到的是同一个对象
                System.out.println(t.getName() + "：正在试衣服...");
                Thread.sleep(5000);
            }

            System.out.println(t.getName() + ":结账离开...");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}